package com.christina.engine.state;

import com.christina.engine.state.model.StateTransitionResult;
import com.christina.engine.state.model.StateContext;

/**
 * 对话状态接口
 * 定义了对话状态的基本行为
 * 
 * @author Christina
 */
public interface ConversationState {
    
    /**
     * 获取状态名称
     * 
     * @return 状态名称
     */
    String getStateName();
    
    /**
     * 获取状态类型
     * 
     * @return 状态类型
     */
    StateType getStateType();
    
    /**
     * 进入状态时的处理
     * 
     * @param context 状态上下文
     * @return 处理结果
     */
    StateTransitionResult onEnter(StateContext context);
    
    /**
     * 在状态中处理消息
     * 
     * @param message 消息内容
     * @param context 状态上下文
     * @return 处理结果
     */
    StateTransitionResult handleMessage(String message, StateContext context);
    
    /**
     * 退出状态时的处理
     * 
     * @param context 状态上下文
     * @return 处理结果
     */
    StateTransitionResult onExit(StateContext context);
    
    /**
     * 检查是否可以转换到指定状态
     * 
     * @param targetState 目标状态
     * @param context 状态上下文
     * @return 是否可以转换
     */
    boolean canTransitionTo(ConversationState targetState, StateContext context);
    
    /**
     * 获取可能的下一个状态列表
     * 
     * @param context 状态上下文
     * @return 可能的下一个状态列表
     */
    java.util.List<ConversationState> getPossibleNextStates(StateContext context);
    
    /**
     * 检查状态是否已完成
     * 
     * @param context 状态上下文
     * @return 是否已完成
     */
    boolean isCompleted(StateContext context);
    
    /**
     * 获取状态超时时间（毫秒）
     * 
     * @return 超时时间，返回-1表示无超时
     */
    long getTimeoutMillis();
    
    /**
     * 处理状态超时
     * 
     * @param context 状态上下文
     * @return 处理结果
     */
    StateTransitionResult onTimeout(StateContext context);
    
    /**
     * 状态类型枚举
     */
    enum StateType {
        /**
         * 初始状态
         */
        INITIAL,
        
        /**
         * 处理中状态
         */
        PROCESSING,
        
        /**
         * 等待输入状态
         */
        WAITING_INPUT,
        
        /**
         * 等待确认状态
         */
        WAITING_CONFIRMATION,
        
        /**
         * 信息收集状态
         */
        INFORMATION_GATHERING,
        
        /**
         * 完成状态
         */
        COMPLETED,
        
        /**
         * 错误状态
         */
        ERROR,
        
        /**
         * 终止状态
         */
        TERMINATED
    }
}